#pragma once

#include <string>
#include <vector>
#include <thread>
#include <atomic>
#include <mutex>
#include <condition_variable>
#include <functional>
#include "msp_protocol.h"

/**
 * 姿态可视化类
 * 用于将飞控传回的姿态角度数据可视化显示
 */
class AttitudeVisualizer {
 public:
  // 构造与析构
  AttitudeVisualizer();
  ~AttitudeVisualizer();

  // 更新姿态数据
  void updateAttitude(const MSP::AttitudeData &attitude);
  void updateRawImu(const MSP::RawImuData &imu);

  // 开始/停止可视化
  bool start();
  void stop();

  // 检查是否正在运行
  bool isRunning() const;

  // 获取当前姿态数据
  MSP::AttitudeData getAttitude() const;
  MSP::RawImuData getRawImu() const;

 private:
  // 姿态数据
  MSP::AttitudeData attitude_;
  MSP::RawImuData rawImu_;

  // 线程控制
  std::thread visualizeThread_;
  std::atomic<bool> isRunning_;
  mutable std::mutex dataMutex_;

  // 可视化线程函数
  void visualizeThreadFunc();

  // 在终端中显示姿态
  void displayTerminalAttitude();

  // 在终端上绘制简单的人工水平仪
  void drawArtificialHorizon(float roll, float pitch, int width, int height);

  // 将原始IMU数据转换为可读格式
  std::string formatImuData(const MSP::RawImuData &imu) const;

  // 清屏函数
  void clearScreen() const;
};